{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "470988d3",
   "metadata": {},
   "source": [
    "# 正规方程"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b73135cc",
   "metadata": {},
   "source": [
    "## 二元一次方程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "82aa60ce",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1,  1],\n",
       "       [ 2, -1]])"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "x = np.array([[1,1],[2,-1]])\n",
    "y = np.array([14,10])\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9b78be37",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([14, 10])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "11f054bb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([8., 6.])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linalg.solve(x,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "498b0c5f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([8., 6.])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linalg.inv(x.T.dot(x)).dot(x.T).dot(y)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ff6e0fa7",
   "metadata": {},
   "source": [
    "## 三元一次方程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "877f6338",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1, -1,  1],\n",
       "       [ 2,  1, -1],\n",
       "       [ 3, -2,  6]])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([[1,-1,1],[2,1,-1],[3,-2,6]])\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "1a8d5a69",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([100,  80, 256])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b = np.array([100,80,256])\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "a7b061cf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 60., -41.,  -1.])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linalg.solve(a,b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "988437fb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 60., -41.,  -1.])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linalg.inv(a.T.dot(a)).dot(a.T).dot(b)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "271ad3f2",
   "metadata": {},
   "source": [
    "## 八元一次方程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "fe4bd19a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.34891595,  3.99280374, 15.74450569,  4.18957768,  7.50545046,\n",
       "        3.06481677, 17.99824495, 12.07904039])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.array([[0,14,8,0,5,-2,9,-3],\n",
    " [-4,10,6,4,-14,-2,-14,8],\n",
    " [ -1,-6,5,-12,3,-3,2,-2],\n",
    " [5,-2,3,10,5,11,4,-8],\n",
    " [-15,-15,-8,-15 ,7,-4,-12,2],\n",
    " [ 11,-10, -2,  4 , 3 , -9 , -6 ,  7],\n",
    " [-14  , 0  , 4  ,-3  , 5 , 10  ,13   ,7],\n",
    " [ -3 , -7 , -2 , -8  , 0 , -6  ,-5  ,-9]])\n",
    "y = np.array([339,-114,30,126,-395,-87,442,-309])\n",
    "np.linalg.inv(x.T.dot(x)).dot(x.T).dot(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "0b8be4fb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.34891595,  3.99280374, 15.74450569,  4.18957768,  7.50545046,\n",
       "        3.06481677, 17.99824495, 12.07904039])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linalg.solve(x,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "a2ec1417",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  0,  14,   8,   0,   5,  -2,   9,  -3],\n",
       "       [ -4,  10,   6,   4, -14,  -2, -14,   8],\n",
       "       [ -1,  -6,   5, -12,   3,  -3,   2,  -2],\n",
       "       [  5,  -2,   3,  10,   5,  11,   4,  -8],\n",
       "       [-15, -15,  -8, -15,   7,  -4, -12,   2],\n",
       "       [ 11, -10,  -2,   4,   3,  -9,  -6,   7],\n",
       "       [-14,   0,   4,  -3,   5,  10,  13,   7],\n",
       "       [ -3,  -7,  -2,  -8,   0,  -6,  -5,  -9]])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "array([ 339, -114,   30,  126, -395,  -87,  442, -309])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display(x,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "bdfd5df0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.34891595,  3.99280374, 15.74450569,  4.18957768,  7.50545046,\n",
       "        3.06481677, 17.99824495, 12.07904039])"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linalg.inv(x1.T.dot(x1)).dot(x1.T).dot(y1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "e9ae6141",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  0,  14,   8,   0,   5,  -2,   9,  -3],\n",
       "       [ -4,  10,   6,   4, -14,  -2, -14,   8],\n",
       "       [ -1,  -6,   5, -12,   3,  -3,   2,  -2],\n",
       "       [  5,  -2,   3,  10,   5,  11,   4,  -8],\n",
       "       [-15, -15,  -8, -15,   7,  -4, -12,   2],\n",
       "       [ 11, -10,  -2,   4,   3,  -9,  -6,   7],\n",
       "       [-14,   0,   4,  -3,   5,  10,  13,   7],\n",
       "       [ -3,  -7,  -2,  -8,   0,  -6,  -5,  -9]])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "array([ 339, -114,   30,  126, -395,  -87,  442, -309])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "array([-0.34891595,  3.99280374, 15.74450569,  4.18957768,  7.50545046,\n",
       "        3.06481677, 17.99824495, 12.07904039])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "model = LinearRegression(fit_intercept=False)\n",
    "display(x,y)\n",
    "model.fit(x,y)\n",
    "model.coef_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "894b8dba",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.intercept_"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cb628aa3",
   "metadata": {},
   "source": [
    "# 作业"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "1a391197",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.linear_model import LinearRegression"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1cd3a3d1",
   "metadata": {},
   "source": [
    "## 解析数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "8237374d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[   0],\n",
       "       [ 500],\n",
       "       [1000],\n",
       "       [1500],\n",
       "       [2000],\n",
       "       [2500],\n",
       "       [3000],\n",
       "       [3500],\n",
       "       [4000]])"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.arange(0,4001,500)\n",
    "x = x.reshape((9,1))\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "921fbaf3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 12.834044,  10.190649,   5.500229,   2.854665,  -0.706488,\n",
       "        -4.065323,  -7.12748 , -10.058879, -13.206465])"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y = np.array([12.834044,10.190649,5.500229,2.854665,-0.706488,-4.065323,-7.127480,-10.058879,-13.206465])\n",
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "2a819ab4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[   0],\n",
       "       [ 500],\n",
       "       [1000],\n",
       "       [1500],\n",
       "       [2000],\n",
       "       [2500],\n",
       "       [3000],\n",
       "       [3500],\n",
       "       [4000]])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "array([ 12.834044,  10.190649,   5.500229,   2.854665,  -0.706488,\n",
       "        -4.065323,  -7.12748 , -10.058879, -13.206465])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "display(x,y)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b3d00859",
   "metadata": {},
   "source": [
    "## 构建线性模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "25b7783d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-0.00656953] 12.718507511111111\n"
     ]
    }
   ],
   "source": [
    "#fit_intercept=True 计算截距，拟合，训练\n",
    "model = LinearRegression()\n",
    "model.fit(x,y)\n",
    "print(model.coef_,model.intercept_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "99f946c1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-0.00208065] 0.0\n"
     ]
    }
   ],
   "source": [
    "#fit_intercept=False 忽略截距，拟合，训练\n",
    "model1 = LinearRegression(fit_intercept=False)\n",
    "model1.fit(x,y)\n",
    "print(model1.coef_,model1.intercept_)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "53eaf425",
   "metadata": {},
   "source": [
    "## 正规方程求解"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8ddb40fa",
   "metadata": {},
   "source": [
    "$W = (X^TX)^{-1}X^Ty$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "e71d9557",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.00208065])"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#不考虑截距时求得的斜率\n",
    "np.linalg.inv(x.T.dot(x)).dot(x.T).dot(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "66ff0f94",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[   0,    1],\n",
       "       [ 500,    1],\n",
       "       [1000,    1],\n",
       "       [1500,    1],\n",
       "       [2000,    1],\n",
       "       [2500,    1],\n",
       "       [3000,    1],\n",
       "       [3500,    1],\n",
       "       [4000,    1]])"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#改变x的结构，增加截距列\n",
    "x = np.concatenate([x,np.full(shape=(9,1),fill_value=1)],axis=1)\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "2167ee4d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.00656953, 12.71850751])"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#计算加入截距后的斜率\n",
    "np.set_printoptions(suppress=True)\n",
    "#当指定 `suppress=True` 时，NumPy 不会使用科学计数法来显示小数，而是以小数形式显示它们。\n",
    "np.linalg.inv(x.T.dot(x)).dot(x.T).dot(y)\n",
    "# a = np.linalg.inv(x.T.dot(x)).dot(x.T).dot(y)[0]\n",
    "# b = np.linalg.inv(x.T.dot(x)).dot(x.T).dot(y)[1]\n",
    "# print(a,b)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "ca880703",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-39.83773248999999"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#自定义函数\n",
    "def fun(high):\n",
    "    return -0.00656953*high+12.71850751\n",
    "fun(8000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "134fa559",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([   0,  500, 1000, 1500, 2000, 2500, 3000, 3500, 4000])"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x[:,0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "1e2e31f7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 12.834044,  10.190649,   5.500229,   2.854665,  -0.706488,\n",
       "        -4.065323,  -7.12748 , -10.058879, -13.206465])"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "04d83bfb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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OdC+PWzebHdlIjXC9ntWnnzySbKyskpfjz32mN0liYh4Pj8/eOwxcy9LdDTs2AEdO8Lbb5vFEUV8iO1hJSQkhMjIyNLX+bqMKSJSeV26mKeFevc2jePuu888MZSXZ3dlItXG9rAydepULrjgAtq0acMzzzzDsWPH7C5JRMS71K8PX38NL7wA/v4wf77pybJ+vd2ViVQLfzv/+JgxY4iNjSUsLIzU1FQmTpxIRkYG77zzzil/p6ioiKKT2k7n5+e7o1QREc/mdMKDD5p+LLfdBrt2ma63L7wA999vHnkW8VLV/jTQ5MmTSUxMPO0x69ato3379uX2f/7559x8883s37+fCy64oEqfr6eBRET+18GD8Ne/wpdfmu1+/eD9900nXBEPYeujy/v372f//v2nPeaiiy4iKKj8Ghm//PILDRs2ZO3atcTFxVX4uxVdWWnUqJHCiojIySzLPM48fjwcO2Yay338MXTubHdlIkDVwkq1TwPVq1ePevXqndXvbty4EYCoqAo6OP6vwMBAAgMDz+rzRURqDYcDRo0yU0EDB5pFELt2haefhocfNtNGIl7Ctn9aU1JSeOWVV0hPTycjI4P58+dz77330q9fPxo3bmxXWSIiviU2FjZsMPexFBfDxInmyaGcHLsrE6k028JKYGAgn3zyCddeey0tWrTgiSee4J577uHjjz+2qyQREd8UGgoffQSzZkHduqahXOvWpkeLiBdQu30Rkdpk61YzLbRtm5kqeuIJePxx02ROxI28pt2+iIi4WUwMpKbC3Xebm3ATE6FHD9i71+7KRE5JYUVEpLYJDoZ334UPPzQ/JyebaaGkJLsrE6mQwoqISG01eDCkpZmgsn+/ufF2wgQ4ftzuykTKUFgREanNLr0U1q6FkSPN9tSp5hHn3bvtrUvkJAorIiK1XVCQaSD36afmyaGUFGjbFhYssLsyEUBhRURETrj5Zti4ETp0MC37+/eHsWPNas4iNlJYERGR/9OsGaxeDePGme1p00wX3J077a1LajWFFRERKSsgAF56CRYtMosfpqWZTriffGJ3ZVJLKayIiEjF+vSB9HS4+mooKDAt+++9F44etbsyqWUUVkRE5NQaNTJt+R991HS8nTkT4uJg+3a7K5NaRGFFREROz9/frNa8ZAlERMCWLdC+PcyebXdlUksorIiISOVcfz1s2gTdusGR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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(x[:,0],y)\n",
    "x1 = np.arange(0,4001,500)\n",
    "y1 = fun(x1)\n",
    "plt.plot(x1,y1,color='r')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0032f367",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "223px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
